#include "SDL/SDL.h"
#include "SDL/SDL_image.h"
#include "../modelo/Escenario.h"
#include "../modelo/Pantalla.h"
#include "../modelo/TipoEntidad.h"
#include "../modelo/util/Mousemapping.h"
#include "../modelo/Personaje.h"
#include <map>
#include "EntidadDibujar.h"
#include "Niebla.h"
#include "SDL/SDL_ttf.h"
#include "../modelo/util/LoggerConsola.h"
#include "../modelo/bonus/Bonus.h"
#include "../modelo/bonus/BonusBomba.h"

using namespace std;

#ifndef VISTA_H_
#define VISTA_H_

class Vista {
public:

	Vista(map<string,TipoEntidad*> mapaTipoEntidad, SDL_Surface *screen);
	void dibujarEscenario(Escenario* escenario, Pantalla* pantalla);
	void actualizarEscenario(Escenario* escenario, Pantalla* pantalla);
	void dibujar(int posIniX, int posIniY, Escenario* escenario, Pantalla* pantalla);
	void dibujarMapa(Escenario*, Pantalla*);
	void blitTile(SDL_Surface *dest, int x, int y, Casilla* casilla, bool sonVecinas);
	SDL_Surface* ajustarImagen(SDL_Surface*, AccionTipoEntidad*, TipoEntidad*);
	void DrawPixel(SDL_Surface *surface, int x, int y, Uint32 pixel);
	Uint32 ReadPixel(SDL_Surface *surface, int x, int y);
	SDL_Surface* ScaleSurface(SDL_Surface *Surface, Uint16 Width,
			Uint16 Height);
	pair<string,AccionTipoEntidad*> obtenerParAccionTipoEntidadEstado(string nombre,string estado);
	pair<string,AccionTipoEntidad*> obtenerParAccionTipoEntidadCongelado(string nombre);
	pair<string,AccionTipoEntidad*> obtenerParAccionTipoEntidadFrizado(string nombre);
	void agregarEstadosBomba();
	virtual ~Vista();

private:
	LoggerConsola logger;
	void iniciar(map<string,TipoEntidad*> mapaTipoEntidad);
	void almacenarEntidadesADibujar(list<Entidad*> entidades, SDL_Surface* dest,
			SDL_Rect* destRect, bool esVecina);
	void dibujarEntidades();
	void almacenarPersonajesADibujar(list<Personaje*> personajes, SDL_Surface* dest,
			SDL_Rect* destRect);
	void almacenarBonusADibujar(list<Bonus*> bonus, SDL_Surface* dest, SDL_Rect* destRect);
	void dibujarPersonajes();
	void alinearPosicionSur(Escenario* escenario, pair<int, int>* inicio,
			pair<int, int>* fin);
	void alinearColumnaEste(Escenario* escenario, pair<int, int>* vertSupIzq,
			pair<int, int>* vertInfIzq, pair<int, int>* vertSupDer,
			pair<int, int>* vertInfDer);
	string alinearPosicionEste(Escenario* escenario, pair<int, int>* inicio,
			pair<int, int>* fin);
	void liberarEntidadesADibujar();
	void liberarPersonajesADibujar();
	void dibujarBonus(Personaje* protagonista);
	SDL_Surface *screen;
	map<string, AccionTipoEntidad*> mapeadorDeImagenes;
	SDL_Surface *tiles, *tileGris;
	list<EntidadDibujar*> entidadesADibujar;
	list<EntidadDibujar*> personajesADibujar;
	TTF_Font* fuente;
	SDL_Colour color_texto;
};

#endif /* VISTA_H_ */
